// 版权所有2010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

/*
	Hypot -- sqrt(p*p + q*q), but overflows only if the result does.
*/

// hypop返回Sqrt（p*p+q*q），注意避免不必要的溢出和下溢。特殊情况是：低血压（±Inf，q）=+Inf-
// Hypot（p，±Inf）=+Inf-
// Hypot（NaN，q）=NaN 
// Hypot（p，NaN）=NaN 
func Hypot(p, q float64) float64 {
	if haveArchHypot {
		return archHypot(p, q)
	}
	return hypot(p, q)
}

func hypot(p, q float64) float64 {
	// 
	switch {
	case IsInf(p, 0) || IsInf(q, 0):
		return Inf(1)
	case IsNaN(p) || IsNaN(q):
		return NaN()
	}
	p, q = Abs(p), Abs(q)
	if p < q {
		p, q = q, p
	}
	if p == 0 {
		return 0
	}
	q = q / p
	return p * Sqrt(1+q*q)
}
